heat_with_all_greater %>% melt(.) %>%
  mutate(gene = rep(c("ALK", "ARHGAP26", "ERG", "ETV1", "MAML3", "NTRK3", "RARA", "RET", "TACC3", "TFE3"), times = 19), .before = variable) %>%
  mutate(groups = cut(.$value, breaks = c(1, 0.05, 0))) %>%
  ggplot(., aes(gene, variable, fill = groups)) +
  geom_tile( colour = "white", linetype = 1) +
  scale_fill_discrete(breaks = levels(groups)) +
  theme(axis.text = element_text(size = 15)) +
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=0.5)) +
  labs(x = "Gene", y = "Cancer Type") 
No id variables; using all as measure variables

comparison of overexpression approaches

95th percentile overexpression identified more fusion gene samples only 3 samples were identified by Tukey's outlier that were not identified by 95th percentile (3 ETV1 prostate adenocarcinoma samples)

false positives when applied to all cancers

outlier_false_pos <- all_genes %>%
  filter(is_outlier == TRUE, fusion != "Fusion") %>% select(rail_id, gene, Project_ID)
write_csv(outlier_false_pos, 'outlier_false_pos.csv')

above95_false_pos <- all_genes %>%
  filter(above_95 == TRUE, fusion != "Fusion") %>% select(rail_id, gene, Project_ID)
write_csv(above95_false_pos, 'above95_false_pos.csv')

shared_false_pos <- all_genes %>%
  filter(above_95 == TRUE, is_outlier == TRUE, fusion != "Fusion") %>% select(rail_id, gene, Project_ID)
write_csv(shared_false_pos, 'shared_false_pos.csv')
all_genes %>%
  ungroup() %>%
  filter(has_cancer == "Cancer", above_95 == TRUE, fusion != "Fusion") %>% select(rail_id, gene, Project_ID) %>%
  group_by(gene) %>%
  mutate(gene_total = n()) %>%
  distinct(gene_total)
ided_by_both 
outlier_fusions %>% filter(gene != "TMPRSS2")
above_95percent
all_genes %>% filter(fusion == "Fusion") %>% ungroup() %>%
  summarise(n = n())
ided_by_both %>% ungroup() %>% group_by(gene) %>% summarise(n = n())
outlier_fusions %>% ungroup() %>% group_by(gene) %>% summarise(n = n())

difference is outlier picks up an extra 3 in ETV1

ided_by_both %>% filter(gene == "ETV1")
outlier_fusions %>% filter(gene == "ETV1")

-it picks up 3 extra etv1 prostate fusions

etv1_combined %>% filter(has_cancer == "Cancer", Project_ID == "PRAD") %>%
  ggplot(aes(x = Project_ID, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = is_outlier))

etv1_combined %>% filter(has_cancer == "Cancer", Project_ID == "PRAD") %>%
  ggplot(aes(x = log2_auc_norm)) +
  geom_density() +
  geom_vline(aes(xintercept = log2_auc_norm), data = . %>% filter(fusion == "Fusion"))
shape_in_words3(shape_for_heatmap(etv1_combined))
outlier_false_pos
above95_false_pos
shared_false_pos

-larger discrepancy in false pos

comparing false positives

fpr_specific %>% group_by(gene, Project_ID) %>% summarise(n = n())

1241 samples for 95th

fpr_specific_outlier %>% group_by(gene, Project_ID) %>% summarise(n = n())

322 for outlier

fpr_specific_shared %>% group_by(gene, Project_ID) %>% summarise(n = n())

282 shared

overexp captures capture all the same for alk, arhgap26, erg, etv1 prad shared 19 (outlier 33), maml3, ntrk3, rara, ret luad shared 28 (outlier 54), tacc3, tfe3

so 2 cases where overexpress doesn't capture same false positives

etv1_combined %>% filter(has_cancer == "Cancer", Tissue == "Prostate", fusion == "Fusion")

boxplot visualisation of genes

alk_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

arhgap26_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

erg_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

etv1_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

maml3_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

ntrk3_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

rara_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

ret_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

tacc3_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

tfe3_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

tmprss2_combined %>%
  filter(cancer_status == "Cancer") %>%
  ggplot(aes(x = Cancer, y = log2_auc_norm)) +
  geom_boxplot() +
  geom_jitter(aes(colour = Cancer), data=. %>% filter(fusion == "Fusion")) +
  theme(legend.position = "none") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Tukey's outlier method

so these graphs are the the outlier == TRUE

expression_function_mutate(erg_counts) %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(maml3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(tfe3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(tmprss2_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(rara_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

#middle
expression_function_mutate(tacc3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(ret_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(etv1_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(ntrk3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(alk_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(arhgap26_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(is_outlier == "TRUE") %>%
  ggplot(aes(x = Cancer, fill = fusion)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

graphs fusions == TRUE, stacked by outliers

#early breaks
expression_function_mutate(erg_counts) %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(maml3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(tfe3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(tmprss2_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(rara_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

#middle
expression_function_mutate(tacc3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(ret_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(etv1_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(ntrk3_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(alk_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

expression_function_mutate(arhgap26_counts) %>%
  filter(cancer_status == "Cancer") %>%
  filter(fusion == "Fusion") %>%
  ggplot(aes(x = Cancer, fill = is_outlier)) +
  geom_bar(position = "fill") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

-not as nice looking like this

LS0tCnRpdGxlOiAiT3ZlcmV4cHJlc3Npb24gYW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQphbGsudGVzdDIgPC0gcmJpbmQoYWxrX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiS2lkbmV5IFJlbmFsIFBhcGlsbGFyeSBDZWxsIENhcmNpbm9tYSIpLCAKICAgICAgYWxrX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiTHVuZyBBZGVub2NhcmNpbm9tYSIpLCAKICAgICAgYWxrX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiU2tpbiBDdXRhbmVvdXMgTWVsYW5vbWEiKSwgCiAgICAgIGFsa19jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIlRoeXJvaWQgQ2FyY2lub21hIikpICU+JQogIGZpbHRlcihoYXNfY2FuY2VyID09ICJDYW5jZXIiKSAlPiUKICBzcGxpdChmID0gbGlzdChhcy5jaGFyYWN0ZXIoLiRDYW5jZXIpKSkgJT4lCiAgbWFwKH53aWxjb3gudGVzdCgueCRsb2cyX2F1Y19ub3JtIH4gLngkZnVzaW9uLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikkcC52YWx1ZSkgJT4lIAogIHVubGlzdCguLCAuJENhbmNlcikgJT4lCiAgdCguKSAlPiUKICBkYXRhLmZyYW1lKC4pICU+JQogICAgIG11dGF0ZShBY3V0ZS5NeWVsb2lkLkxldWtlbWlhID0gMSwgQmxhZGRlci5Vcm90aGVsaWFsLkNhcmNpbm9tYSA9IDEsIEJyYWluLkxvd2VyLkdyYWRlLkdsaW9tYSA9IDEsIEJyZWFzdC5JbnZhc2l2ZS5DYXJjaW5vbWEgPSAxLCBDZXJ2aWNhbC5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYS5hbmQuRW5kb2NlcnZpY2FsLkFkZW5vY2FyY2lub21hID0gMSwgQ29sb24uQWRlbm9jYXJjaW5vbWEgPSAxLCBFc29waGFnZWFsLkNhcmNpbm9tYSA9IDEsIEhlYWQuYW5kLk5lY2suU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuQ2xlYXIuQ2VsbC5DYXJjaW5vbWEgPSAxLCBMaXZlci5IZXBhdG9jZWxsdWxhci5DYXJjaW5vbWEgPSAxLCBMdW5nLlNxdWFtb3VzLkNlbGwuQ2FyY2lub21hID0gMSwgUGhlb2Nocm9tb2N5dG9tYS5hbmQuUGFyYWdhbmdsaW9tYQk9IDEsIFByb3N0YXRlLkFkZW5vY2FyY2lub21hID0gMSwgIFN0b21hY2guQWRlbm9jYXJjaW5vbWEgPSAxKSAgJT4lCiAgLlssIG9yZGVyKGNvbG5hbWVzKC4pKV0KCmFyaC50ZXN0MiA8LSByYmluZChhcmhnYXAyNl9jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkx1bmcgQWRlbm9jYXJjaW5vbWEiKSwgCiAgICAgIGFyaGdhcDI2X2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiU3RvbWFjaCBBZGVub2NhcmNpbm9tYSIpKSAlPiUKICBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIikgJT4lCiAgc3BsaXQoZiA9IGxpc3QoYXMuY2hhcmFjdGVyKC4kQ2FuY2VyKSkpICU+JQogIG1hcCh+d2lsY294LnRlc3QoLngkbG9nMl9hdWNfbm9ybSB+IC54JGZ1c2lvbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUpICU+JSAKICB1bmxpc3QoLiwgLiRDYW5jZXIpICU+JQogIHQoLikgJT4lCiAgZGF0YS5mcmFtZSguKSAlPiUKICAgICBtdXRhdGUoQWN1dGUuTXllbG9pZC5MZXVrZW1pYSA9IDEsIEJsYWRkZXIuVXJvdGhlbGlhbC5DYXJjaW5vbWEgPSAxLCBCcmFpbi5Mb3dlci5HcmFkZS5HbGlvbWEgPSAxLCBCcmVhc3QuSW52YXNpdmUuQ2FyY2lub21hID0gMSwgQ2VydmljYWwuU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEuYW5kLkVuZG9jZXJ2aWNhbC5BZGVub2NhcmNpbm9tYSA9IDEsIENvbG9uLkFkZW5vY2FyY2lub21hID0gMSwgRXNvcGhhZ2VhbC5DYXJjaW5vbWEgPSAxLCBIZWFkLmFuZC5OZWNrLlNxdWFtb3VzLkNlbGwuQ2FyY2lub21hID0gMSwgS2lkbmV5LlJlbmFsLkNsZWFyLkNlbGwuQ2FyY2lub21hID0gMSwgS2lkbmV5LlJlbmFsLlBhcGlsbGFyeS5DZWxsLkNhcmNpbm9tYSA9IDEsIExpdmVyLkhlcGF0b2NlbGx1bGFyLkNhcmNpbm9tYSA9IDEsIEx1bmcuU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBQaGVvY2hyb21vY3l0b21hLmFuZC5QYXJhZ2FuZ2xpb21hCT0gMSwgUHJvc3RhdGUuQWRlbm9jYXJjaW5vbWEgPSAxLCBTa2luLkN1dGFuZW91cy5NZWxhbm9tYSA9IDEsIFRoeXJvaWQuQ2FyY2lub21hID0gMSkgICU+JQogIC5bLCBvcmRlcihjb2xuYW1lcyguKSldCgplcmcudGVzdDIgPC0gcmJpbmQoZXJnX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiUHJvc3RhdGUgQWRlbm9jYXJjaW5vbWEiKSklPiUKICBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIikgJT4lCiAgc3BsaXQoZiA9IGxpc3QoYXMuY2hhcmFjdGVyKC4kQ2FuY2VyKSkpICU+JQogIG1hcCh+d2lsY294LnRlc3QoLngkbG9nMl9hdWNfbm9ybSB+IC54JGZ1c2lvbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUpICU+JSAKICB1bmxpc3QoLiwgLiRDYW5jZXIpICU+JQogIHQoLikgJT4lCiAgZGF0YS5mcmFtZSguKSAlPiUKICAgICBtdXRhdGUoQWN1dGUuTXllbG9pZC5MZXVrZW1pYSA9IDEsIEJsYWRkZXIuVXJvdGhlbGlhbC5DYXJjaW5vbWEgPSAxLCBCcmFpbi5Mb3dlci5HcmFkZS5HbGlvbWEgPSAxLCBCcmVhc3QuSW52YXNpdmUuQ2FyY2lub21hID0gMSwgQ2VydmljYWwuU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEuYW5kLkVuZG9jZXJ2aWNhbC5BZGVub2NhcmNpbm9tYSA9IDEsIENvbG9uLkFkZW5vY2FyY2lub21hID0gMSwgRXNvcGhhZ2VhbC5DYXJjaW5vbWEgPSAxLCBIZWFkLmFuZC5OZWNrLlNxdWFtb3VzLkNlbGwuQ2FyY2lub21hID0gMSwgS2lkbmV5LlJlbmFsLkNsZWFyLkNlbGwuQ2FyY2lub21hID0gMSwgS2lkbmV5LlJlbmFsLlBhcGlsbGFyeS5DZWxsLkNhcmNpbm9tYSA9IDEsIExpdmVyLkhlcGF0b2NlbGx1bGFyLkNhcmNpbm9tYSA9IDEsIEx1bmcuQWRlbm9jYXJjaW5vbWEgPSAxLCBMdW5nLlNxdWFtb3VzLkNlbGwuQ2FyY2lub21hID0gMSwgUGhlb2Nocm9tb2N5dG9tYS5hbmQuUGFyYWdhbmdsaW9tYQk9IDEsIFNraW4uQ3V0YW5lb3VzLk1lbGFub21hID0gMSwgU3RvbWFjaC5BZGVub2NhcmNpbm9tYSA9IDEsIFRoeXJvaWQuQ2FyY2lub21hID0gMSkgICU+JQogIC5bLCBvcmRlcihjb2xuYW1lcyguKSldCgpldHYudGVzdDIgPC0gcmJpbmQoZXR2MV9jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIlByb3N0YXRlIEFkZW5vY2FyY2lub21hIikpJT4lCiAgZmlsdGVyKGhhc19jYW5jZXIgPT0gIkNhbmNlciIpICU+JQogIHNwbGl0KGYgPSBsaXN0KGFzLmNoYXJhY3RlciguJENhbmNlcikpKSAlPiUKICBtYXAofndpbGNveC50ZXN0KC54JGxvZzJfYXVjX25vcm0gfiAueCRmdXNpb24sIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlKSAlPiUgCiAgdW5saXN0KC4sIC4kQ2FuY2VyKSAlPiUKICB0KC4pICU+JQogIGRhdGEuZnJhbWUoLikgJT4lCiAgICAgbXV0YXRlKEFjdXRlLk15ZWxvaWQuTGV1a2VtaWEgPSAxLCBCbGFkZGVyLlVyb3RoZWxpYWwuQ2FyY2lub21hID0gMSwgQnJhaW4uTG93ZXIuR3JhZGUuR2xpb21hID0gMSwgQnJlYXN0LkludmFzaXZlLkNhcmNpbm9tYSA9IDEsIENlcnZpY2FsLlNxdWFtb3VzLkNlbGwuQ2FyY2lub21hLmFuZC5FbmRvY2VydmljYWwuQWRlbm9jYXJjaW5vbWEgPSAxLCBDb2xvbi5BZGVub2NhcmNpbm9tYSA9IDEsIEVzb3BoYWdlYWwuQ2FyY2lub21hID0gMSwgSGVhZC5hbmQuTmVjay5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYSA9IDEsIEtpZG5leS5SZW5hbC5DbGVhci5DZWxsLkNhcmNpbm9tYSA9IDEsIEtpZG5leS5SZW5hbC5QYXBpbGxhcnkuQ2VsbC5DYXJjaW5vbWEgPSAxLCBMaXZlci5IZXBhdG9jZWxsdWxhci5DYXJjaW5vbWEgPSAxLCBMdW5nLkFkZW5vY2FyY2lub21hID0gMSwgTHVuZy5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYSA9IDEsIFBoZW9jaHJvbW9jeXRvbWEuYW5kLlBhcmFnYW5nbGlvbWEJPSAxLCBTa2luLkN1dGFuZW91cy5NZWxhbm9tYSA9IDEsIFN0b21hY2guQWRlbm9jYXJjaW5vbWEgPSAxLCBUaHlyb2lkLkNhcmNpbm9tYSA9IDEpICAlPiUKICAuWywgb3JkZXIoY29sbmFtZXMoLikpXQoKbWFtLnRlc3QyIDwtIHJiaW5kKG1hbWwzX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiUGhlb2Nocm9tb2N5dG9tYSBhbmQgUGFyYWdhbmdsaW9tYSIpKSU+JQogIGZpbHRlcihoYXNfY2FuY2VyID09ICJDYW5jZXIiKSAlPiUKICBzcGxpdChmID0gbGlzdChhcy5jaGFyYWN0ZXIoLiRDYW5jZXIpKSkgJT4lCiAgbWFwKH53aWxjb3gudGVzdCgueCRsb2cyX2F1Y19ub3JtIH4gLngkZnVzaW9uLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikkcC52YWx1ZSkgJT4lIAogIHVubGlzdCguLCAuJENhbmNlcikgJT4lCiAgdCguKSAlPiUKICBkYXRhLmZyYW1lKC4pICU+JQogICAgIG11dGF0ZShBY3V0ZS5NeWVsb2lkLkxldWtlbWlhID0gMSwgQmxhZGRlci5Vcm90aGVsaWFsLkNhcmNpbm9tYSA9IDEsIEJyYWluLkxvd2VyLkdyYWRlLkdsaW9tYSA9IDEsIEJyZWFzdC5JbnZhc2l2ZS5DYXJjaW5vbWEgPSAxLCBDZXJ2aWNhbC5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYS5hbmQuRW5kb2NlcnZpY2FsLkFkZW5vY2FyY2lub21hID0gMSwgQ29sb24uQWRlbm9jYXJjaW5vbWEgPSAxLCBFc29waGFnZWFsLkNhcmNpbm9tYSA9IDEsIEhlYWQuYW5kLk5lY2suU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuQ2xlYXIuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuUGFwaWxsYXJ5LkNlbGwuQ2FyY2lub21hID0gMSwgTGl2ZXIuSGVwYXRvY2VsbHVsYXIuQ2FyY2lub21hID0gMSwgTHVuZy5BZGVub2NhcmNpbm9tYSA9IDEsIEx1bmcuU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBQcm9zdGF0ZS5BZGVub2NhcmNpbm9tYSA9IDEsIFNraW4uQ3V0YW5lb3VzLk1lbGFub21hID0gMSwgU3RvbWFjaC5BZGVub2NhcmNpbm9tYSA9IDEsIFRoeXJvaWQuQ2FyY2lub21hID0gMSkgICU+JQogIC5bLCBvcmRlcihjb2xuYW1lcyguKSldCgpudHIudGVzdDIgPC0gcmJpbmQobnRyazNfY291bnRzICU+JSBmaWx0ZXIoQ2FuY2VyID09ICJDb2xvbiBBZGVub2NhcmNpbm9tYSIpLCAKICAgICAgICAgICAgbnRyazNfY291bnRzICU+JSBmaWx0ZXIoQ2FuY2VyID09ICJUaHlyb2lkIENhcmNpbm9tYSIpKSAlPiUKICBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIikgJT4lCiAgc3BsaXQoZiA9IGxpc3QoYXMuY2hhcmFjdGVyKC4kQ2FuY2VyKSkpICU+JQogIG1hcCh+d2lsY294LnRlc3QoLngkbG9nMl9hdWNfbm9ybSB+IC54JGZ1c2lvbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUpICU+JSAKICB1bmxpc3QoLiwgLiRDYW5jZXIpICU+JQogIHQoLikgJT4lCiAgZGF0YS5mcmFtZSguKSAlPiUKICAgICBtdXRhdGUoQWN1dGUuTXllbG9pZC5MZXVrZW1pYSA9IDEsIEJsYWRkZXIuVXJvdGhlbGlhbC5DYXJjaW5vbWEgPSAxLCBCcmFpbi5Mb3dlci5HcmFkZS5HbGlvbWEgPSAxLCBCcmVhc3QuSW52YXNpdmUuQ2FyY2lub21hID0gMSwgQ2VydmljYWwuU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEuYW5kLkVuZG9jZXJ2aWNhbC5BZGVub2NhcmNpbm9tYSA9IDEsIEVzb3BoYWdlYWwuQ2FyY2lub21hID0gMSwgSGVhZC5hbmQuTmVjay5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYSA9IDEsIEtpZG5leS5SZW5hbC5DbGVhci5DZWxsLkNhcmNpbm9tYSA9IDEsIEtpZG5leS5SZW5hbC5QYXBpbGxhcnkuQ2VsbC5DYXJjaW5vbWEgPSAxLCBMaXZlci5IZXBhdG9jZWxsdWxhci5DYXJjaW5vbWEgPSAxLCBMdW5nLkFkZW5vY2FyY2lub21hID0gMSwgTHVuZy5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYSA9IDEsIFBoZW9jaHJvbW9jeXRvbWEuYW5kLlBhcmFnYW5nbGlvbWEJPSAxLCBQcm9zdGF0ZS5BZGVub2NhcmNpbm9tYSA9IDEsIFNraW4uQ3V0YW5lb3VzLk1lbGFub21hID0gMSwgU3RvbWFjaC5BZGVub2NhcmNpbm9tYSA9IDEpICAlPiUKICAuWywgb3JkZXIoY29sbmFtZXMoLikpXQoKcmFyYS50ZXN0MiA8LSByYmluZChyYXJhX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiQWN1dGUgTXllbG9pZCBMZXVrZW1pYSIpLCAKICAgICAgICAgICAgcmFyYV9jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkJyZWFzdCBJbnZhc2l2ZSBDYXJjaW5vbWEiKSkgJT4lCiAgZmlsdGVyKGhhc19jYW5jZXIgPT0gIkNhbmNlciIpICU+JQogIHNwbGl0KGYgPSBsaXN0KGFzLmNoYXJhY3RlciguJENhbmNlcikpKSAlPiUKICBtYXAofndpbGNveC50ZXN0KC54JGxvZzJfYXVjX25vcm0gfiAueCRmdXNpb24sIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlKSAlPiUgCiAgdW5saXN0KC4sIC4kQ2FuY2VyKSAlPiUKICB0KC4pICU+JQogIGRhdGEuZnJhbWUoLikgJT4lCiAgICAgbXV0YXRlKEJsYWRkZXIuVXJvdGhlbGlhbC5DYXJjaW5vbWEgPSAxLCBCcmFpbi5Mb3dlci5HcmFkZS5HbGlvbWEgPSAxLCBDZXJ2aWNhbC5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYS5hbmQuRW5kb2NlcnZpY2FsLkFkZW5vY2FyY2lub21hID0gMSwgQ29sb24uQWRlbm9jYXJjaW5vbWEgPSAxLCBFc29waGFnZWFsLkNhcmNpbm9tYSA9IDEsIEhlYWQuYW5kLk5lY2suU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuQ2xlYXIuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuUGFwaWxsYXJ5LkNlbGwuQ2FyY2lub21hID0gMSwgTGl2ZXIuSGVwYXRvY2VsbHVsYXIuQ2FyY2lub21hID0gMSwgTHVuZy5BZGVub2NhcmNpbm9tYSA9IDEsIEx1bmcuU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBQaGVvY2hyb21vY3l0b21hLmFuZC5QYXJhZ2FuZ2xpb21hCT0gMSwgUHJvc3RhdGUuQWRlbm9jYXJjaW5vbWEgPSAxLCBTa2luLkN1dGFuZW91cy5NZWxhbm9tYSA9IDEsIFN0b21hY2guQWRlbm9jYXJjaW5vbWEgPSAxLCBUaHlyb2lkLkNhcmNpbm9tYSA9IDEpICAlPiUKICAuWywgb3JkZXIoY29sbmFtZXMoLikpXQoKcmV0LnRlc3QyIDwtIHJiaW5kKHJldF9jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkx1bmcgQWRlbm9jYXJjaW5vbWEiKSwgCiAgICAgICAgICAgIHJldF9jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIlRoeXJvaWQgQ2FyY2lub21hIikpICU+JQogIGZpbHRlcihoYXNfY2FuY2VyID09ICJDYW5jZXIiKSAlPiUKICBzcGxpdChmID0gbGlzdChhcy5jaGFyYWN0ZXIoLiRDYW5jZXIpKSkgJT4lCiAgbWFwKH53aWxjb3gudGVzdCgueCRsb2cyX2F1Y19ub3JtIH4gLngkZnVzaW9uLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikkcC52YWx1ZSkgJT4lIAogIHVubGlzdCguLCAuJENhbmNlcikgJT4lCiAgdCguKSAlPiUKICBkYXRhLmZyYW1lKC4pICU+JQogICAgIG11dGF0ZShBY3V0ZS5NeWVsb2lkLkxldWtlbWlhID0gMSwgQmxhZGRlci5Vcm90aGVsaWFsLkNhcmNpbm9tYSA9IDEsIEJyYWluLkxvd2VyLkdyYWRlLkdsaW9tYSA9IDEsIEJyZWFzdC5JbnZhc2l2ZS5DYXJjaW5vbWEgPSAxLCBDZXJ2aWNhbC5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYS5hbmQuRW5kb2NlcnZpY2FsLkFkZW5vY2FyY2lub21hID0gMSwgQ29sb24uQWRlbm9jYXJjaW5vbWEgPSAxLCBFc29waGFnZWFsLkNhcmNpbm9tYSA9IDEsIEhlYWQuYW5kLk5lY2suU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuQ2xlYXIuQ2VsbC5DYXJjaW5vbWEgPSAxLCBLaWRuZXkuUmVuYWwuUGFwaWxsYXJ5LkNlbGwuQ2FyY2lub21hID0gMSwgTGl2ZXIuSGVwYXRvY2VsbHVsYXIuQ2FyY2lub21hID0gMSwgTHVuZy5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYSA9IDEsIFBoZW9jaHJvbW9jeXRvbWEuYW5kLlBhcmFnYW5nbGlvbWEJPSAxLCBQcm9zdGF0ZS5BZGVub2NhcmNpbm9tYSA9IDEsIFNraW4uQ3V0YW5lb3VzLk1lbGFub21hID0gMSwgU3RvbWFjaC5BZGVub2NhcmNpbm9tYSA9IDEpICAlPiUKICAuWywgb3JkZXIoY29sbmFtZXMoLikpXQoKdGFjYy50ZXN0MiA8LSByYmluZCh0YWNjM19jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkJsYWRkZXIgVXJvdGhlbGlhbCBDYXJjaW5vbWEiKSwgCiAgICAgIHRhY2MzX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiQnJhaW4gTG93ZXIgR3JhZGUgR2xpb21hIiksIAogICAgICB0YWNjM19jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkJyZWFzdCBJbnZhc2l2ZSBDYXJjaW5vbWEiKSwgCiAgICAgIHRhY2MzX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiQ2VydmljYWwgU3F1YW1vdXMgQ2VsbCBDYXJjaW5vbWEgYW5kIEVuZG9jZXJ2aWNhbCBBZGVub2NhcmNpbm9tYSIpLCAKICAgICAgdGFjYzNfY291bnRzICU+JSBmaWx0ZXIoQ2FuY2VyID09ICJFc29waGFnZWFsIENhcmNpbm9tYSIpLAogICAgICB0YWNjM19jb3VudHMgJT4lIGZpbHRlcihDYW5jZXIgPT0gIkhlYWQgYW5kIE5lY2sgU3F1YW1vdXMgQ2VsbCBDYXJjaW5vbWEiKSwKICAgICAgdGFjYzNfY291bnRzICU+JSBmaWx0ZXIoQ2FuY2VyID09ICJLaWRuZXkgUmVuYWwgUGFwaWxsYXJ5IENlbGwgQ2FyY2lub21hIiksCiAgICAgIHRhY2MzX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiTGl2ZXIgSGVwYXRvY2VsbHVsYXIgQ2FyY2lub21hIiksCiAgICAgIHRhY2MzX2NvdW50cyAlPiUgZmlsdGVyKENhbmNlciA9PSAiTHVuZyBTcXVhbW91cyBDZWxsIENhcmNpbm9tYSIpKSAlPiUKICBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIikgJT4lCiAgc3BsaXQoZiA9IGxpc3QoYXMuY2hhcmFjdGVyKC4kQ2FuY2VyKSkpICU+JQogIG1hcCh+d2lsY294LnRlc3QoLngkbG9nMl9hdWNfbm9ybSB+IC54JGZ1c2lvbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUpICU+JSAKICB1bmxpc3QoLiwgLiRDYW5jZXIpICU+JQogIHQoLikgJT4lCiAgZGF0YS5mcmFtZSguKSAlPiUKICAgbXV0YXRlKEFjdXRlLk15ZWxvaWQuTGV1a2VtaWEgPSAxLCBDb2xvbi5BZGVub2NhcmNpbm9tYSA9IDEsIEtpZG5leS5SZW5hbC5DbGVhci5DZWxsLkNhcmNpbm9tYSA9IDEsIEx1bmcuQWRlbm9jYXJjaW5vbWEgPSAxLCBQaGVvY2hyb21vY3l0b21hLmFuZC5QYXJhZ2FuZ2xpb21hCT0gMSwgUHJvc3RhdGUuQWRlbm9jYXJjaW5vbWEgPSAxLCBTa2luLkN1dGFuZW91cy5NZWxhbm9tYSA9IDEsIFN0b21hY2guQWRlbm9jYXJjaW5vbWEgPSAxLCBUaHlyb2lkLkNhcmNpbm9tYSA9IDEpICAlPiUKICAuWywgb3JkZXIoY29sbmFtZXMoLikpXQoKdGZlLnRlc3QyIDwtIHJiaW5kKHRmZTNfY291bnRzICU+JSBmaWx0ZXIoQ2FuY2VyID09ICJLaWRuZXkgUmVuYWwgQ2xlYXIgQ2VsbCBDYXJjaW5vbWEiKSwgCiAgICAgICAgICAgIHRmZTNfY291bnRzICU+JSBmaWx0ZXIoQ2FuY2VyID09ICJLaWRuZXkgUmVuYWwgUGFwaWxsYXJ5IENlbGwgQ2FyY2lub21hIikpICU+JQogIGZpbHRlcihoYXNfY2FuY2VyID09ICJDYW5jZXIiKSAlPiUKICBzcGxpdChmID0gbGlzdChhcy5jaGFyYWN0ZXIoLiRDYW5jZXIpKSkgJT4lCiAgbWFwKH53aWxjb3gudGVzdCgueCRsb2cyX2F1Y19ub3JtIH4gLngkZnVzaW9uLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikkcC52YWx1ZSkgJT4lIAogIHVubGlzdCguLCAuJENhbmNlcikgJT4lCiAgdCguKSAlPiUKICBkYXRhLmZyYW1lKC4pICU+JQogICAgIG11dGF0ZShBY3V0ZS5NeWVsb2lkLkxldWtlbWlhID0gMSwgQmxhZGRlci5Vcm90aGVsaWFsLkNhcmNpbm9tYSA9IDEsIEJyYWluLkxvd2VyLkdyYWRlLkdsaW9tYSA9IDEsIEJyZWFzdC5JbnZhc2l2ZS5DYXJjaW5vbWEgPSAxLCBDZXJ2aWNhbC5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYS5hbmQuRW5kb2NlcnZpY2FsLkFkZW5vY2FyY2lub21hID0gMSwgQ29sb24uQWRlbm9jYXJjaW5vbWEgPSAxLCBFc29waGFnZWFsLkNhcmNpbm9tYSA9IDEsIEhlYWQuYW5kLk5lY2suU3F1YW1vdXMuQ2VsbC5DYXJjaW5vbWEgPSAxLCBMaXZlci5IZXBhdG9jZWxsdWxhci5DYXJjaW5vbWEgPSAxLCBMdW5nLkFkZW5vY2FyY2lub21hID0gMSwgTHVuZy5TcXVhbW91cy5DZWxsLkNhcmNpbm9tYSA9IDEsIFBoZW9jaHJvbW9jeXRvbWEuYW5kLlBhcmFnYW5nbGlvbWEJPSAxLCBQcm9zdGF0ZS5BZGVub2NhcmNpbm9tYSA9IDEsIFNraW4uQ3V0YW5lb3VzLk1lbGFub21hID0gMSwgU3RvbWFjaC5BZGVub2NhcmNpbm9tYSA9IDEsIFRoeXJvaWQuQ2FyY2lub21hID0gMSkgICU+JQogIC5bLCBvcmRlcihjb2xuYW1lcyguKSldCiAKaGVhdF90cmlhbF9uYV9ncmVhdGVyIDwtZGF0YS5mcmFtZShyYmluZChhbGsudGVzdDIsIGFyaC50ZXN0MiwgZXJnLnRlc3QyLCBldHYudGVzdDIsIG1hbS50ZXN0MiwgbnRyLnRlc3QyLCByYXJhLnRlc3QyLCByZXQudGVzdDIsIHRhY2MudGVzdDIsIHRmZS50ZXN0MikpIApyb3duYW1lcyhoZWF0X3RyaWFsX25hX2dyZWF0ZXIpIDwtIGMoIkFMSyIsICJBUkhHQVAyNiIsICJFUkciLCAiRVRWMSIsICJNQU1MMyIsICJOVFJLMyIsICJSQVJBIiwgIlJFVCIsICJUQUNDMyIsICJURkUzIikKaGVhdF90cmlhbF9uYV9ncmVhdGVyIDwtIG5hX2lmKGhlYXRfdHJpYWxfbmFfZ3JlYXRlciwgMSkKaGVhdF90cmlhbF9uYV9ncmVhdGVyCgphbGxfY2FuY2VyX3BfZ3JlYXRlciA8LSBhbGxfZ2VuZXMgJT4lCiAgZmlsdGVyKGhhc19jYW5jZXIgPT0gIkNhbmNlciIpICU+JQogIHNwbGl0KGYgPSBsaXN0KGFzLmNoYXJhY3RlciguJGdlbmUpKSkgJT4lCiAgbWFwKH53aWxjb3gudGVzdCguJGxvZzJfYXVjX25vcm0gfiAuJGZ1c2lvbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUpICU+JQogIHVubGlzdCguLCAuJGdlbmUpICU+JQogIGRhdGEuZnJhbWUoKQpjb2xuYW1lcyhhbGxfY2FuY2VyX3BfZ3JlYXRlcikgPC0gIkFsbCIKYWxsX2NhbmNlcl9wX2dyZWF0ZXIKaGVhdF93aXRoX2FsbF9ncmVhdGVyIDwtIGNiaW5kKGhlYXRfdHJpYWxfbmFfZ3JlYXRlciwgYWxsX2NhbmNlcl9wX2dyZWF0ZXIpCmhlYXRfd2l0aF9hbGxfZ3JlYXRlcgoKaGVhdF93aXRoX2FsbF9ncmVhdGVyICU+JSBtZWx0KC4pICU+JQogIG11dGF0ZShnZW5lID0gcmVwKGMoIkFMSyIsICJBUkhHQVAyNiIsICJFUkciLCAiRVRWMSIsICJNQU1MMyIsICJOVFJLMyIsICJSQVJBIiwgIlJFVCIsICJUQUNDMyIsICJURkUzIiksIHRpbWVzID0gMTkpLCAuYmVmb3JlID0gdmFyaWFibGUpICU+JQogIG11dGF0ZShncm91cHMgPSBjdXQoLiR2YWx1ZSwgYnJlYWtzID0gYygxLCAwLjA1LCAwKSkpICU+JQogIGdncGxvdCguLCBhZXMoZ2VuZSwgdmFyaWFibGUsIGZpbGwgPSBncm91cHMpKSArCiAgZ2VvbV90aWxlKCBjb2xvdXIgPSAid2hpdGUiLCBsaW5ldHlwZSA9IDEpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGJyZWFrcyA9IGxldmVscyhncm91cHMpKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDAuNSwgaGp1c3Q9MC41KSkgKwogIGxhYnMoeCA9ICJHZW5lIiwgeSA9ICJDYW5jZXIgVHlwZSIpIApgYGAKI2NvbXBhcmlzb24gb2Ygb3ZlcmV4cHJlc3Npb24gYXBwcm9hY2hlcwo5NXRoIHBlcmNlbnRpbGUgb3ZlcmV4cHJlc3Npb24gaWRlbnRpZmllZCBtb3JlIGZ1c2lvbiBnZW5lIHNhbXBsZXMKb25seSAzIHNhbXBsZXMgd2VyZSBpZGVudGlmaWVkIGJ5IFR1a2V5J3Mgb3V0bGllciB0aGF0IHdlcmUgbm90IGlkZW50aWZpZWQgYnkgOTV0aCBwZXJjZW50aWxlICgzIEVUVjEgcHJvc3RhdGUgYWRlbm9jYXJjaW5vbWEgc2FtcGxlcykKCmZhbHNlIHBvc2l0aXZlcyB3aGVuIGFwcGxpZWQgdG8gYWxsIGNhbmNlcnMKYGBge3J9Cm91dGxpZXJfZmFsc2VfcG9zIDwtIGFsbF9nZW5lcyAlPiUKICBmaWx0ZXIoaXNfb3V0bGllciA9PSBUUlVFLCBmdXNpb24gIT0gIkZ1c2lvbiIpICU+JSBzZWxlY3QocmFpbF9pZCwgZ2VuZSwgUHJvamVjdF9JRCkKd3JpdGVfY3N2KG91dGxpZXJfZmFsc2VfcG9zLCAnb3V0bGllcl9mYWxzZV9wb3MuY3N2JykKCmFib3ZlOTVfZmFsc2VfcG9zIDwtIGFsbF9nZW5lcyAlPiUKICBmaWx0ZXIoYWJvdmVfOTUgPT0gVFJVRSwgZnVzaW9uICE9ICJGdXNpb24iKSAlPiUgc2VsZWN0KHJhaWxfaWQsIGdlbmUsIFByb2plY3RfSUQpCndyaXRlX2NzdihhYm92ZTk1X2ZhbHNlX3BvcywgJ2Fib3ZlOTVfZmFsc2VfcG9zLmNzdicpCgpzaGFyZWRfZmFsc2VfcG9zIDwtIGFsbF9nZW5lcyAlPiUKICBmaWx0ZXIoYWJvdmVfOTUgPT0gVFJVRSwgaXNfb3V0bGllciA9PSBUUlVFLCBmdXNpb24gIT0gIkZ1c2lvbiIpICU+JSBzZWxlY3QocmFpbF9pZCwgZ2VuZSwgUHJvamVjdF9JRCkKd3JpdGVfY3N2KHNoYXJlZF9mYWxzZV9wb3MsICdzaGFyZWRfZmFsc2VfcG9zLmNzdicpCmBgYAoKYGBge3J9CmFsbF9nZW5lcyAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKGhhc19jYW5jZXIgPT0gIkNhbmNlciIsIGFib3ZlXzk1ID09IFRSVUUsIGZ1c2lvbiAhPSAiRnVzaW9uIikgJT4lIHNlbGVjdChyYWlsX2lkLCBnZW5lLCBQcm9qZWN0X0lEKSAlPiUKICBncm91cF9ieShnZW5lKSAlPiUKICBtdXRhdGUoZ2VuZV90b3RhbCA9IG4oKSkgJT4lCiAgZGlzdGluY3QoZ2VuZV90b3RhbCkKYGBgCgoKCgoKYGBge3J9CmlkZWRfYnlfYm90aCAKb3V0bGllcl9mdXNpb25zICU+JSBmaWx0ZXIoZ2VuZSAhPSAiVE1QUlNTMiIpCmFib3ZlXzk1cGVyY2VudApgYGAKYGBge3J9CmFsbF9nZW5lcyAlPiUgZmlsdGVyKGZ1c2lvbiA9PSAiRnVzaW9uIikgJT4lIHVuZ3JvdXAoKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkKYGBgCgpgYGB7cn0KaWRlZF9ieV9ib3RoICU+JSB1bmdyb3VwKCkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkKYGBgCgpgYGB7cn0Kb3V0bGllcl9mdXNpb25zICU+JSB1bmdyb3VwKCkgJT4lIGdyb3VwX2J5KGdlbmUpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkKYGBgCmRpZmZlcmVuY2UgaXMgb3V0bGllciBwaWNrcyB1cCBhbiBleHRyYSAzIGluIEVUVjEKCmBgYHtyfQppZGVkX2J5X2JvdGggJT4lIGZpbHRlcihnZW5lID09ICJFVFYxIikKYGBgCgpgYGB7cn0Kb3V0bGllcl9mdXNpb25zICU+JSBmaWx0ZXIoZ2VuZSA9PSAiRVRWMSIpCmBgYAotaXQgcGlja3MgdXAgMyBleHRyYSBldHYxIHByb3N0YXRlIGZ1c2lvbnMKCmBgYHtyfQpldHYxX2NvbWJpbmVkICU+JSBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIiwgUHJvamVjdF9JRCA9PSAiUFJBRCIpICU+JQogIGdncGxvdChhZXMoeCA9IFByb2plY3RfSUQsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gaXNfb3V0bGllcikpCgpldHYxX2NvbWJpbmVkICU+JSBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIiwgUHJvamVjdF9JRCA9PSAiUFJBRCIpICU+JQogIGdncGxvdChhZXMoeCA9IGxvZzJfYXVjX25vcm0pKSArCiAgZ2VvbV9kZW5zaXR5KCkgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBsb2cyX2F1Y19ub3JtKSwgZGF0YSA9IC4gJT4lIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpKQpgYGAKYGBge3J9CnNoYXBlX2luX3dvcmRzMyhzaGFwZV9mb3JfaGVhdG1hcChldHYxX2NvbWJpbmVkKSkKYGBgCgoKYGBge3J9Cm91dGxpZXJfZmFsc2VfcG9zCmFib3ZlOTVfZmFsc2VfcG9zCnNoYXJlZF9mYWxzZV9wb3MKYGBgCi1sYXJnZXIgZGlzY3JlcGFuY3kgaW4gZmFsc2UgcG9zCgojY29tcGFyaW5nIGZhbHNlIHBvc2l0aXZlcwpgYGB7cn0KZnByX3NwZWNpZmljICU+JSBncm91cF9ieShnZW5lLCBQcm9qZWN0X0lEKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpCmBgYAoxMjQxIHNhbXBsZXMgZm9yIDk1dGgKYGBge3J9CmZwcl9zcGVjaWZpY19vdXRsaWVyICU+JSBncm91cF9ieShnZW5lLCBQcm9qZWN0X0lEKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpCmBgYAozMjIgZm9yIG91dGxpZXIKCmBgYHtyfQpmcHJfc3BlY2lmaWNfc2hhcmVkICU+JSBncm91cF9ieShnZW5lLCBQcm9qZWN0X0lEKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpCmBgYAoyODIgc2hhcmVkCgpvdmVyZXhwIGNhcHR1cmVzIApjYXB0dXJlIGFsbCB0aGUgc2FtZSBmb3IgYWxrLCBhcmhnYXAyNiwgZXJnLCBldHYxIHByYWQgc2hhcmVkIDE5IChvdXRsaWVyIDMzKSwgbWFtbDMsIG50cmszLCByYXJhLCByZXQgbHVhZCBzaGFyZWQgMjggKG91dGxpZXIgNTQpLCB0YWNjMywgdGZlMwoKc28gMiBjYXNlcyB3aGVyZSBvdmVyZXhwcmVzcyBkb2Vzbid0IGNhcHR1cmUgc2FtZSBmYWxzZSBwb3NpdGl2ZXMKCmBgYHtyfQpldHYxX2NvbWJpbmVkICU+JSBmaWx0ZXIoaGFzX2NhbmNlciA9PSAiQ2FuY2VyIiwgVGlzc3VlID09ICJQcm9zdGF0ZSIsIGZ1c2lvbiA9PSAiRnVzaW9uIikKYGBgCgojYm94cGxvdCB2aXN1YWxpc2F0aW9uIG9mIGdlbmVzCgpgYGB7cn0KYWxrX2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmFyaGdhcDI2X2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmVyZ19jb21iaW5lZCAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCB5ID0gbG9nMl9hdWNfbm9ybSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91ciA9IENhbmNlciksIGRhdGE9LiAlPiUgZmlsdGVyKGZ1c2lvbiA9PSAiRnVzaW9uIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCgpldHYxX2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCm1hbWwzX2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCm50cmszX2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCnJhcmFfY29tYmluZWQgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgeSA9IGxvZzJfYXVjX25vcm0pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBDYW5jZXIpLCBkYXRhPS4gJT4lIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKcmV0X2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCnRhY2MzX2NvbWJpbmVkICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIHkgPSBsb2cyX2F1Y19ub3JtKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3VyID0gQ2FuY2VyKSwgZGF0YT0uICU+JSBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCnRmZTNfY29tYmluZWQgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgeSA9IGxvZzJfYXVjX25vcm0pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKGFlcyhjb2xvdXIgPSBDYW5jZXIpLCBkYXRhPS4gJT4lIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpgYGAKCiNUdWtleSdzIG91dGxpZXIgbWV0aG9kCgojc28gdGhlc2UgZ3JhcGhzIGFyZSB0aGUgdGhlIG91dGxpZXIgPT0gVFJVRQpgYGB7cn0KI2Vhcmx5IGJyZWFrcwpleHByZXNzaW9uX2Z1bmN0aW9uX211dGF0ZShlcmdfY291bnRzKSAlPiUKICBmaWx0ZXIoaXNfb3V0bGllciA9PSAiVFJVRSIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGZ1c2lvbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKG1hbWwzX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihpc19vdXRsaWVyID09ICJUUlVFIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUodGZlM19jb3VudHMpICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBmaWx0ZXIoaXNfb3V0bGllciA9PSAiVFJVRSIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGZ1c2lvbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKHRtcHJzczJfY291bnRzKSAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZmlsdGVyKGlzX291dGxpZXIgPT0gIlRSVUUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIGZpbGwgPSBmdXNpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCgpleHByZXNzaW9uX2Z1bmN0aW9uX211dGF0ZShyYXJhX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihpc19vdXRsaWVyID09ICJUUlVFIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQojbWlkZGxlCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKHRhY2MzX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihpc19vdXRsaWVyID09ICJUUlVFIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUocmV0X2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihpc19vdXRsaWVyID09ICJUUlVFIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUoZXR2MV9jb3VudHMpICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBmaWx0ZXIoaXNfb3V0bGllciA9PSAiVFJVRSIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGZ1c2lvbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKG50cmszX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihpc19vdXRsaWVyID09ICJUUlVFIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUoYWxrX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihpc19vdXRsaWVyID09ICJUUlVFIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUoYXJoZ2FwMjZfY291bnRzKSAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZmlsdGVyKGlzX291dGxpZXIgPT0gIlRSVUUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIGZpbGwgPSBmdXNpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmBgYAoKI2dyYXBocyBmdXNpb25zID09IFRSVUUsIHN0YWNrZWQgYnkgb3V0bGllcnMKYGBge3J9CiNlYXJseSBicmVha3MKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUoZXJnX2NvdW50cykgJT4lCiAgZmlsdGVyKGZ1c2lvbiA9PSAiRnVzaW9uIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gaXNfb3V0bGllcikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKG1hbWwzX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGlzX291dGxpZXIpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCgpleHByZXNzaW9uX2Z1bmN0aW9uX211dGF0ZSh0ZmUzX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGlzX291dGxpZXIpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCgpleHByZXNzaW9uX2Z1bmN0aW9uX211dGF0ZSh0bXByc3MyX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGlzX291dGxpZXIpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCgpleHByZXNzaW9uX2Z1bmN0aW9uX211dGF0ZShyYXJhX2NvdW50cykgJT4lCiAgZmlsdGVyKGNhbmNlcl9zdGF0dXMgPT0gIkNhbmNlciIpICU+JQogIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpICU+JQogIGdncGxvdChhZXMoeCA9IENhbmNlciwgZmlsbCA9IGlzX291dGxpZXIpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCiNtaWRkbGUKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUodGFjYzNfY291bnRzKSAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZmlsdGVyKGZ1c2lvbiA9PSAiRnVzaW9uIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gaXNfb3V0bGllcikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKHJldF9jb3VudHMpICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIGZpbGwgPSBpc19vdXRsaWVyKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUoZXR2MV9jb3VudHMpICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIGZpbGwgPSBpc19vdXRsaWVyKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUobnRyazNfY291bnRzKSAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZmlsdGVyKGZ1c2lvbiA9PSAiRnVzaW9uIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gaXNfb3V0bGllcikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKCmV4cHJlc3Npb25fZnVuY3Rpb25fbXV0YXRlKGFsa19jb3VudHMpICU+JQogIGZpbHRlcihjYW5jZXJfc3RhdHVzID09ICJDYW5jZXIiKSAlPiUKICBmaWx0ZXIoZnVzaW9uID09ICJGdXNpb24iKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDYW5jZXIsIGZpbGwgPSBpc19vdXRsaWVyKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZXhwcmVzc2lvbl9mdW5jdGlvbl9tdXRhdGUoYXJoZ2FwMjZfY291bnRzKSAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZmlsdGVyKGZ1c2lvbiA9PSAiRnVzaW9uIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ2FuY2VyLCBmaWxsID0gaXNfb3V0bGllcikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgotbm90IGFzIG5pY2UgbG9va2luZyBsaWtlIHRoaXMKYGBge3J9CmFsbF9nZW5lcyAlPiUKICBmaWx0ZXIoY2FuY2VyX3N0YXR1cyA9PSAiQ2FuY2VyIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZSwgQ2FuY2VyKSAlPiUKICBtdXRhdGUobWluID0gbWluKGxvZzJfYXVjX25vcm0pLAogICAgICAgICAgICBxdWFudDI1ID0gcXVhbnRpbGUobG9nMl9hdWNfbm9ybSwgcHJvYnMgPSAwLjI1KSwgCiAgICAgICAgICAgIHF1YW50NTAgPSBxdWFudGlsZShsb2cyX2F1Y19ub3JtLCBwcm9icyA9IDAuNSksCiAgICAgICAgICAgIHF1YW50NzUgPSBxdWFudGlsZShsb2cyX2F1Y19ub3JtLCBwcm9icyA9IDAuNzUpLAogICAgICAgICAgICBtYXggPSBtYXgobG9nMl9hdWNfbm9ybSksCiAgICAgICAgICAgIG91dGxpZXIgPSAocXVhbnQ3NSArIDEuNSoocXVhbnQ3NSAtIHF1YW50MjUpKSkgJT4lCiAgbXV0YXRlKGlzX291dGxpZXIgPSBpZmVsc2UobG9nMl9hdWNfbm9ybSA+PSBvdXRsaWVyLCBULCBGKSkgJT4lCiAgZmlsdGVyKGlzX291dGxpZXIgPT0gIlRSVUUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQcm9qZWN0X0lELCBmaWxsID0gZnVzaW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSArCiAgZmFjZXRfd3JhcCh+IGdlbmUpCmBgYAoKYGBge3J9CnRhY2MzX2NvbWJpbmVkICU+JQogIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIpICU+JQogIGdncGxvdChhZXMoeCA9IFByb2plY3RfSUQsIGZpbGwgPSBpc19vdXRsaWVyKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSArCiAgbGFicyh0aXRsZSA9ICJUQUNDMzogcHJvcG9ydGlvbiBvZiBmdXNpb25zIGFzIG91dGxpZXJzIikKYGBgCgpgYGB7cn0KYWxsX2dlbmVzICU+JQogIGZpbHRlcihmdXNpb24gPT0gIkZ1c2lvbiIsIGdlbmUgIT0gIlRNUFJTUzIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBnZW5lLCBmaWxsID0gaXNfb3V0bGllcikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkgKwogIGxhYnModGl0bGUgPSAiU2Vuc2l0aXZpdHkgb2Ygb3V0bGllcnMgaW4gaWRlbnRpZnlpbmcgZnVzaW9ucyIpCmBgYAoKCgoKCgoKCg==